class Father {
  constructor(x, y) {
    this.x = x
    this.y = y
    console.log('构造函数中的this指向创建的实例对象：');
    console.log(this);
  }
  sum() {
    console.log(this.x + this.y);
  }
  say() {

      console.log('方法里面的this指向这个方法的调用者：');
      console.log(this);
      return '我是爸爸'
    }
    //方法之间不能加逗号分隔，同时方法不需要添加 function 关键字。
}

class Son extends Father {
  constructor(x, y) {
    super(x, y) //super()必须再子类的this之前调用
      //即必须先调用父亲的构造函数再使用子类
      //调用了父类中的构造函数
    this.x = x
    this.y = y

  }
  sub() {
    console.log(this.x - this.y);
  }
  say() {
    console.log('我是儿子');
    console.log(super.say() + '的儿子');
    //super.say()就是调用父类中的普通函数say()

  }
}
const father = new Father(3, 4);
father.say()
const son = new Son(1, 2);
son.sum()
son.say() //就近原则调用方法
son.sub() //sub()是无参构造函数 无法传递参数

console.log('--------------');


/* 
在 ES6 中类没有变量提升，所以必须先定义类，才能通过类实例化对象
类里面的共有属性和方法一定要加 this 使用
类里面的 this 指向问题：constructor 里面的 this 指向实例对象, 方法里面的 this 指向这个方法的调用者 */